package com.linksfield.topup.mapper;

import com.linksfield.topup.config.dto.CalculateResultParamVo;
import com.linksfield.topup.config.dto.PageAndSort;
import com.linksfield.topup.entity.common.ServicePlanOrderRecord;
import com.linksfield.topup.entity.common.ServicePlanOrderRefund;
import com.linksfield.topup.entity.interfaces.ordermanage.orderexport.request.RequestOrderExport;
import com.linksfield.topup.entity.interfaces.ordermanage.search.request.RequestOrderSearch;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 订单管理业务逻辑数据库操作映射接口
 *
 * @author: lm
 * @date: 2019-11-21 15:40
 */

@Mapper
public interface OrderMapper {
    /***
     *分页数据：搜索之前先去数据库算出分页的具体数据
     * @param request
     * @return
     */
    long searchPageCount(@Param("request") RequestOrderSearch request);

    /***
     *计算成功支付的订单，总订单条数，未启用订单个数，正在使用的订单个数，已结束订单个数
     * @param request
     * @return
     */
    List<CalculateResultParamVo> calculatePackageStatus(@Param("request") RequestOrderSearch request);

    /***
     *计算成功支付的订单，总订单条数，已完成支付个数，已退款个数
     * @param request
     * @return
     */
    List<CalculateResultParamVo> calculatePayStatus(@Param("request") RequestOrderSearch request);

    /**
     * 计算：单次购买个数，自动订阅个数
     * @param request
     * @return
     */
    List<CalculateResultParamVo> calculatePayMode(@Param("request")RequestOrderSearch request);

    /***
     * 根据请求内容和分页信息去搜索订单列表
     * @param request
     * @param pageHelper
     * @return
     */
    List<ServicePlanOrderRecord> search(@Param("request") RequestOrderSearch request,
                                        @Param("pageHelper") PageAndSort pageHelper);

    /***
     *订单管理：订单详情
     * @param partnerCode
     * @param payId
     * @param deviceCode
     * @param orderNo
     * @return
     */
    List<ServicePlanOrderRecord> orderDetails(@Param("partnerCode") String partnerCode,
                                              @Param("payId") String payId,
                                              @Param("deviceCode") String deviceCode,
                                              @Param("orderNo") String orderNo);

    /***
     *订单管理：导出订单(按照选项导出)
     * @param request
     * @return
     */
    List<ServicePlanOrderRecord> orderExportByOptions(@Param("request") RequestOrderExport request);

    /***
     *订单管理：导出订单(按照默认导出)
     * @param request
     * @return
     */
    List<ServicePlanOrderRecord> orderExportByDefault(@Param("request") RequestOrderExport request);

    /***
     * 确认退款
     * @param order
     * @return
     */
    Integer refund(ServicePlanOrderRecord order);

    /**
     * 根据payId获取整个订单信息
     *
     * @param payId
     * @param deviceCode
     * @return
     */
    List<ServicePlanOrderRecord> getOrderByPayId(@Param("payId") String payId,
                                                 @Param("deviceCode") String deviceCode);

    /***
     * 退款时需要生成一条退款记录
     * @param refundOrder
     */
    void writeRefundRecord(ServicePlanOrderRefund refundOrder);

    /**
     * 查询partnerCode这个企业是否已经升级为3.0
     *
     * @param partnerCode
     * @return
     */
    Integer queryUpgradedOrNot(@Param("partnerCode") String partnerCode);
}
